package com.clubupc.modelo;

import java.util.LinkedHashMap;
import java.util.Map;

public class BaseBean extends LinkedHashMap<String, Object> {

	private static final long serialVersionUID = 1L;
	private String table;
	private LinkedHashMap<String, String> config;

	public BaseBean() {
	}

	public BaseBean(String table, LinkedHashMap<String, String> config) {
		this.table = table;
		setConfig(config);
	}

	public BaseBean newInstance() {
		return new BaseBean(table, config);
	}

	public String getTable() {
		return table;
	}

	public void setConfig(LinkedHashMap<String, String> config) {
		if (config != null) {
			if (config.isEmpty()) {
				throw new RuntimeException("El Map de propiedades del Bean no es null, pero esta vacio, revise");
			}
			String[] keys = config.keySet().toArray(new String[] {});
			for (int i = 0; i < keys.length; i++) {
				super.put(keys[i], null);
			}
		}
		this.config = config;
	}

	public Map<String, String> getConfig() {
		return config;
	}

	public String getPropType(String colName) {
		String value = null;
		if (config != null && !config.isEmpty()) {
			value = config.get(colName);
		}
		return value;
	}
	
	public Object putId(String key, Object value) {
		if (key == null) {
			throw new RuntimeException("Se recibio nombre de propiedad 'null' para la tabla:" + table + ", revise");
		}
		if (!super.isEmpty()) {
			String tmpValue = config.get(key);
			if (super.containsKey(key) && tmpValue == null) {
				throw new RuntimeException("El bean de la tabla:'" + table + "' no contiene la propiedad:'" + key + "'");
			}
			if (value != null) {
				String claseValue = value.getClass().getCanonicalName();
				if (!claseValue.equals("java.lang.Integer")) {
					throw new RuntimeException("El bean de la tabla:'" + table + "' define que la propiedad:'" + key + "' es de tipo:'" + tmpValue
							+ "' y el valor enviado es de tipo:'" + claseValue + "'");
				}
			}
		}
		return super.put(key, value);
	}

	public Object put(String key, Object value) {
		if (key == null) {
			throw new RuntimeException("Se recibio nombre de propiedad 'null' para la tabla:" + table + ", revise");
		}
		if (!super.isEmpty()) {
			String tmpValue = config.get(key);
			if (super.containsKey(key) && tmpValue == null) {
				throw new RuntimeException("El bean de la tabla:'" + table + "' no contiene la propiedad:'" + key + "'");
			}
			if (value != null) {
				String claseValue = value.getClass().getCanonicalName();
				if (!tmpValue.equals(claseValue)) {
					throw new RuntimeException("El bean de la tabla:'" + table + "' define que la propiedad:'" + key + "' es de tipo:'" + tmpValue
							+ "' y el valor enviado es de tipo:'" + claseValue + "'");
				}
			}
		}
		return super.put(key, value);
	}
}
